package nio;

import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

/**
 * Buffer都是采用链式编程的方式
 *  mark = -1(标记地址);
 *  position = 0(指这个buffer数据所在的位置);
 *  limit(限制);
 *  capacity(容器大小);
 *	0<=mark<=position<=limit<=capacity
 */
/**
 * Java NIO: Channels and Buffers（通道和缓冲区）
 * 标准的IO基于字节流和字符流进行操作的，而NIO是基于通道（Channel）和缓冲区
 * （Buffer）进行操作，数据总是从通道读取到缓冲区中，或者从缓冲区写入到通道中。 Java NIO: Non-blocking
 * IO（非阻塞IO）Java
 * NIO可以让你非阻塞的使用IO，例如：当线程从通道读取数据到缓冲区时，线程还是可以进行其他事情。当数据被写入到缓冲区时，线程可以继续处理它
 * 从缓冲区写入通道也类似。 Java NIO: Selectors（选择器）Java
 * NIO引入了选择器的概念，选择器用于监听多个通道的事件（比如：连接打开，数据到达）。因此，单个的线程可以监听多个数据通道。
 *
 */
public class One {
	public static void main(String[] args) throws IOException {
		RandomAccessFile aFile = new RandomAccessFile("D:\\develop\\eclipseMQ\\notice.html", "rw");
		//创建管道
		FileChannel inChannel = aFile.getChannel();
		//初始化一个byte为48的byte数组大小
		ByteBuffer buf = ByteBuffer.allocate(48);
		//把其读取到buf中,并且返回是不是-1的数
		int bytesRead = inChannel.read(buf);
		while (bytesRead != -1) {
			System.out.println("Read " + bytesRead);
			//需要通过flip()方法将Buffer从写模式切换到读模式
			buf.flip();
			while (buf.hasRemaining()) {
				System.out.print((char) buf.get());//// read 1 byte at a time
			}
			buf.clear();
			bytesRead = inChannel.read(buf);
		}
		aFile.close();
	}
}
